import Cache from '../cache'
import $Qs from 'qs'
import $Enums from './Enums'
import $nothing from './nothing.js'
import $store from '../store'
import {
	mapGetters,
	mapActions
} from 'vuex'

const initEnv = {
	initConfig: ({
		store
	}) => {},
	initCacheData: ({
		store
	}) => {
		store.dispatch('setAppUser', Cache.getSync(Cache.$Keys.app.APP_USER));
		store.dispatch('setWxInfo', Cache.getSync(Cache.$Keys.app.WX_INFO));
		store.dispatch('setUserInfo', Cache.getSync(Cache.$Keys.app.USER_INFO));
		store.dispatch('setWxJssdk', Cache.getSync(Cache.$Keys.app.WXJSSDK));
		store.dispatch('setSearchRecord', Cache.getSync(Cache.$Keys.SEARCH_RECORD) || []);
	}
}

const $AppContext = {
	_initStatus: false, // 初始化状态
	$vm: null, // 当前页面VM对象
	$router: null,
	$store: null,
	$cache: Cache,
	$Qs,
	$Enums,
	/**
	 * main.js vue实例化的 created 中 使用 AppContext.use(vue) 初始化 $vm、$router、$store
	 * @param vm
	 */
	use: (vm) => {
		vm.$AppContext.$router = vm.$router
		vm.$AppContext.$store = vm.$store
		vm.$AppContext.$store.mapGetters = mapGetters
		vm.$AppContext.$store.mapActions = mapActions
	},
	/**
	 * main.js vue实例化的 created 中调用
	 * @param vm
	 */
	initialize: (vm) => {
		if (!vm.$AppContext._initStatus) {
			vm.$AppContext._initStatus = true
			vm.$AppContext.use(vm)
			initEnv.initConfig({ store: vm.$AppContext.$store })
			initEnv.initCacheData({ store: vm.$AppContext.$store })
		}
	},
	checkLogin: (vm) => {
		// 超过一天清掉重新登录
		if (!$store.getters.appUser.currentTime || $nothing._isNull($store.getters.userInfo.userId)
		|| ($store.getters.appUser.currentTime && new Date().getTime() - $store.getters.appUser.currentTime >= 86400000)) {
			if (vm && vm.route) {
				let url = '/' + vm.route
				if (vm.$mp.query) url = url + '?' + $nothing._jsonParseUrl(vm.$mp.query)
				Cache.setSync(Cache.$Keys.PAGE_URL, url)
				$store.dispatch('setCurrentPage', url)
			}
			return false
		} else return true
	},
	logout: (vm) => {
		Cache.removeSync(Cache.$Keys.app.APP_USER)
		Cache.removeSync(Cache.$Keys.app.WX_INFO)
		Cache.removeSync(Cache.$Keys.app.WXJSSDK)
		Cache.removeSync(Cache.$Keys.PAGE_URL)
		Cache.removeSync(Cache.$Keys.app.USER_INFO)
		initEnv.initCacheData({ store: $store })
	}
}

if (typeof wx !== 'undefined' && !wx.miniProgram) {
  // 小程序环境
  wx.$AppContext = $AppContext
} else if (window) {
  window.$AppContext = $AppContext
  Object.assign(window, $AppContext)
}

export default $AppContext
